Forward 方法

RequestDispatcher 接口的 forward 方法,只有在没有输出提交到向客户端时,通过正在被调用的 servlet 调用。如果响应缓冲区中存在尚未提交的输出数据,这些数据内容必须在目标 servlet 的 service 方法调用前清除。如果响应已经提交,必须抛出一个 IllegalStateException 异常。

请求对象暴露给目标 servlet 的路径元素(path elements)必须反映获得 RequestDispatcher 使用的路径。

唯一例外的是,如果 RequestDispatcher 是通过 getNamedDispatcher方法获得。这种情况下,请求对象的路径元素必须反映这些原始请求。
在 RequestDispatcher 接口的 forward 方法无异常返回之前,响应的内容必须被发送和提交,且由 Servlet 容器关闭,除非请求处于异步模式。如果 RequestDispatcher.forward() 的目标发生错误,异常信息会传回所有调用它经过的过滤器和 servlet,且最终传回给容器。

查询字符串

在转发或包含请求时请求调度机制负责聚集(aggregating)查询字符串参数。

转发的请求参数

除了可以用 getNamedDispatcher 方法获得 servlet 外,已经被另一个servlet 使用 RequestDispatcher 的 forward 方法调用过的servlet,有权访问被调用过的 servlet 的路径。
以下的请求属性必须设置:

  1. javax.servlet.forward.request_uri
  2. javax.servlet.forward.context_path
  3. javax.servlet.forward.servlet_path
  4. javax.servlet.forward.path_info
  5. javax.servlet.forward.query_string

这些属性的值必须分别与 HttpServletRequest 的 getRequestURI,、getContextPath、 getServletPath、getPathInfo、getQueryString 方法的返回值相等,这些方法在从客户端接收到的请求对象上调用,值传递给调用链中的第一个 servlet 对象。

这些属性通过转发 servlet 的请求对象的 getAttribut 方法访问。请注意,即使在多个转发和相继的包含(subsequent includes)被调用的情况下,这些属性必须始终反映原始请求中的信息。

如果转发的 servlet 使用 getNamedDispatcher 方法获得,这些属性必须不能被设置。